home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / ACORNUSERS / EMULATOR / TRASH / Trash80 / !Trash80 / c / EmuReadT < prev    next >
Text File  |  1992-09-27  |  6KB  |  239 lines

  1. #include <stdio.h>
  2. #include "kernel.h"
  3. #include "bbc.h"
  4.  
  5. #include "general.h"
  6. #include "Externals.h"
  7.  
  8. extern u_char RdDisk(u_int ax);
  9.  
  10. static BOOL shiftstatus;
  11.  
  12. u_char ReadRow(int ikmax, u_char *generic, u_char *modifier)
  13. {
  14. u_char ik, vx= 0;
  15.  
  16. if(!shiftstatus)
  17.     for(ik=0; ik<ikmax; ik++)
  18.         {
  19.         char g= generic[ik];
  20.         char m= modifier[ik];
  21.         if(m == 0xff)
  22.             {
  23.             if((_kernel_osbyte(121, g, 0) & 0xff)== 0xff)
  24.                 vx|= 1<<ik;
  25.             continue;
  26.             }
  27.         if((g > 127) && (_kernel_osbyte(121, g, 0) & 0xff)== 0xff)
  28.                 {
  29.                 vx|= 1<<ik;
  30.                 continue;
  31.                 }
  32.         if(    (m > 127) && (m != 0xfe) && !((m == (g | 0x80)) && (g>127)) &&
  33.             ((_kernel_osbyte(121, m, 0) & 0xff)== 0xff))
  34.             vx|= 1<<ik;
  35.         }
  36. else    for(ik=0; ik<ikmax; ik++)
  37.         {
  38.         u_char g= generic[ik];
  39.         u_char m= modifier[ik];
  40.         if(m == 0xff)
  41.             {
  42.             if((_kernel_osbyte(121, g, 0) & 0xff)== 0xff)
  43.                 vx|= 1<<ik;
  44.             continue;
  45.             }
  46.         if((g < 128) && ((_kernel_osbyte(121, g ^ 0x80, 0) & 0xff)== 0xff))
  47.                 {
  48.                 vx|= 1<<ik;
  49.                 continue;
  50.                 }
  51.         if(    (m < 128) && !((m == (g & 0x7f)) && (g<128)) &&
  52.             ((_kernel_osbyte(121, m ^ 0x80, 0) & 0xff)== 0xff))
  53.             vx|= 1<<ik;
  54.         }
  55. return(vx);
  56. }
  57.  
  58. BOOL ReadShift(int ikmax, u_char *generic, u_char *modifier)
  59. {
  60. u_char ik;
  61. if(shiftstatus)
  62.     for(ik=0; ik<ikmax; ik++)
  63.         {
  64.         u_char m= modifier[ik];
  65.         u_char g= generic[ik];
  66.         if(m == 0xfe) continue;
  67.         if((m == 0xff) && ((_kernel_osbyte(121, g, 0) & 0xff)== 0xff))
  68.             return(TRUE);
  69.         if((m < 128) && ((_kernel_osbyte(121, m ^ 0x80, 0) & 0xff)== 0xff))
  70.             return(TRUE);
  71.         }
  72. else    for(ik=0; ik<ikmax; ik++)
  73.         {
  74.         u_char m= modifier[ik];
  75.         if(m == 0xfe) continue;
  76.         if(m == 0xff) continue;
  77.         if((m > 127) && ((_kernel_osbyte(121, m, 0) & 0xff)== 0xff))
  78.             return(TRUE);
  79.         }
  80. return(FALSE);
  81. }
  82.  
  83. u_char EmuKbd(u_int ax)
  84. {
  85. u_char vr= 0;
  86. if((_kernel_osbyte(121,113 ^ 0x80, 0) & 0xff) == 0xff)
  87.     {
  88.     char ip, nomfic[32];
  89.     static const char effacement[] =
  90.         {
  91.         bbc_MultiPurpose, 8, 5, 10, 0, 0, 0, 0, 0, 0
  92.         };
  93.     bbc_tab(0,25); bbc_cursor(1);
  94.     printf("> Command/pathname: ");
  95.     (void) gets(nomfic);
  96.     switch(nomfic[0])
  97.         {
  98.         extern void Traitk7(char *s);
  99.         case 'K':
  100.         case 'k':
  101.             Traitk7(nomfic+1);
  102.             break;
  103.         }
  104.     while((_kernel_osbyte(122,0,0) & 0xff)!= 0xff) ;
  105.     bbc_tab(0,25); bbc_cursor(0);
  106.     for(ip=0; ip<sizeof(effacement); ip++) bbc_vdu(effacement[ip]);
  107.     }
  108. else    {
  109.     shiftstatus= (_kernel_osbyte(121,0 ^ 0x80, 0) & 0xff) == 0xff;
  110.     switch(ax & 0xff)
  111.         {
  112.         static u_char generic01[8]=
  113.             {
  114.             (49 ^ 0x00), (65 ^ 0x80), (100 ^ 0x80), (82 ^ 0x80),
  115.             (50 ^ 0x80), (34 ^ 0x80), (67 ^ 0x80), (83 ^ 0x80)
  116.             };
  117.         static u_char modifier01[8]=
  118.             {
  119.             0xfe, 0xff, 0xff, 0xff,
  120.             0xff, 0xff, 0xff, 0xff
  121.             };
  122.         static u_char generic02[8]=
  123.             {
  124.             (84 ^ 0x80), (37 ^ 0x80), (69 ^ 0x80), (70 ^ 0x80),
  125.             (86 ^ 0x80), (101 ^ 0x80), (85 ^ 0x80), (54 ^ 0x80)
  126.             };
  127.         static u_char modifier02[8]=
  128.             {
  129.             0xff, 0xff, 0xff, 0xff,
  130.             0xff, 0xff, 0xff, 0xff
  131.             };
  132.         static u_char generic04[8]=
  133.             {
  134.             (55 ^ 0x80), (16 ^ 0x80), (51 ^ 0x80), (81 ^ 0x80),
  135.             (35 ^ 0x80), (53 ^ 0x80), (99 ^ 0x80), (33 ^ 0x80)
  136.             };
  137.         static u_char modifier04[8]=
  138.             {
  139.             0xff, 0xff, 0xff, 0xff,
  140.             0xff, 0xff, 0xff, 0xff
  141.             };
  142.         static u_char generic08[3]=
  143.             {
  144.             (66 ^ 0x80), (68 ^ 0x80), (97 ^ 0x80)
  145.             };
  146.         static u_char modifier08[3]=
  147.             {
  148.             0xff, 0xff, 0xff
  149.             };
  150.         static u_char generic10[8]=
  151.             {
  152.             (39 ^ 0x80), (48 ^ 0x80), (49 ^ 0x80), (17 ^ 0x80),
  153.             (18 ^ 0x80), (19 ^ 0x80), (52 ^ 0x80), (36 ^ 0x80)
  154.             };
  155.         static u_char modifier10[8]=
  156.             {
  157.             0xfe,        (48 ^ 0x00), (79 ^ 0x00), (17 ^ 0x00),
  158.             (18 ^ 0x00), (19 ^ 0x00), (36 ^ 0x00), (79 ^ 0x80)
  159.             };
  160.         static u_char generic20[8]=
  161.             {
  162.             (21 ^ 0x80), (38 ^ 0x80), (87 ^ 0x00), (87 ^ 0x80),
  163.             (102^ 0x80), (23 ^ 0x80), (103^ 0x80), (104 ^ 0x80)
  164.             };
  165.         static u_char modifier20[8]=
  166.             {
  167.             (38 ^ 0x00), (39 ^ 0x00), (21 ^ 0x00), (93 ^ 0x00),
  168.             (102^ 0x00), (93 ^ 0x80), (103^ 0x00), (104 ^ 0x00)
  169.             }; 
  170.         static u_char generic40[8]=
  171.             {
  172.             (73 ^ 0x80), (62 ^ 0x80), (44 ^ 0x80), (57 ^ 0x80),
  173.             (41 ^ 0x80), (25 ^ 0x80), (121 ^ 0x80), (98 ^ 0x80)
  174.             };
  175.         static u_char modifier40[8]=
  176.             {
  177.             0xff, 0xff, 0xff, 0xff,
  178.             0xff, 0xff, 0xff, 0xff
  179.             };
  180.         case 0x01:
  181.             vr= ReadRow(8, generic01, modifier01);
  182.             break;
  183.         case 0x02:
  184.             vr= ReadRow(8, generic02, modifier02);
  185.             break;
  186.         case 0x04:
  187.             vr= ReadRow(8, generic04, modifier04);
  188.             break;
  189.         case 0x08:
  190.             vr= ReadRow(3, generic08, modifier08);
  191.             break;
  192.         case 0x10:
  193.             vr= ReadRow(8, generic10, modifier10);
  194.             break;
  195.         case 0x20:
  196.             vr= ReadRow(8, generic20, modifier20);
  197.             break;
  198.         case 0x40:
  199.             vr= ReadRow(8, generic40, modifier40);
  200.             break;
  201.         case 0x80:
  202.             vr= (_kernel_osbyte(121, 2 ^ 0x80, 0) & 0xff) == 0xff ||
  203.                 ReadShift(8, generic01, modifier01) ||
  204.                 ReadShift(8, generic02, modifier02) || 
  205.                 ReadShift(8, generic04, modifier04) || 
  206.                 ReadShift(3, generic08, modifier08) || 
  207.                 ReadShift(8, generic10, modifier10) || 
  208.                 ReadShift(8, generic20, modifier20) || 
  209.                 ReadShift(8, generic40, modifier40) ?
  210.                 1 : 0; 
  211.             break;
  212.         default:
  213.             return(TRSCode->bytes[ax]);
  214.         }
  215.     }
  216. while((_kernel_osbyte(129,0,0)>>8 & 0xff)!= 0xff);
  217. return(vr);
  218. }
  219.  
  220. u_char (*EmuRead[SIZE_CODE>>8])(u_int ax) =
  221.     {
  222.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  223.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  224.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  225.     0, 0, 0, 0, 0, 0, 0,RdDisk,EmuKbd, 0, 0, 0, 0, 0, 0, 0,
  226.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  227.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  228.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  229.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  230.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  231.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  232.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  233.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  234.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  235.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  236.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  237.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  238.     };
  239.